package cn.agiledata.bank.linkbank.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import cn.agiledata.bank.common.util.Constant;
import cn.agiledata.bank.linkbank.exception.LinkBankException;
import cn.agiledata.bank.linkbank.logic.payment.BankPayResponse;

/**
 * 默认的抽象银行支付响应实现
 * 
 * @author 马贤波
 * 
 */
public abstract class AbstractBankPayResponse implements BankPayResponse {

    private Map messages;

    protected AbstractBankPayResponse() {
        this.messages = new HashMap();
    }

    public void setMessages(Map messages) throws LinkBankException {
        for (Iterator it = messages.entrySet().iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            String key = (String) entry.getKey();
            if (isValidKey(key))
                this.messages.put(key, entry.getValue());
        }
    }

    /**
     * 设置key,value对
     * 
     * @param key
     * @param value
     */
    protected final void setMessage(String key, String value) {
        this.messages.put(key, value);
    }

    /**
     * 根据关键字获取银行返回信息
     * 
     * @param key
     *            关键字
     * @return 银行返回信息
     */
    protected final String getMessage(String key) {
        if (key == null)
            return null;
        return (String) this.messages.get(key);
    }

    /**
     * 
     * @return 有效的返回消息关键字数组
     */
    protected String[] getValidKeys() {
        return null;
    }

    /**
     * 判断指定关键字是否有效的返回消息关键字
     * 
     * @param key
     *            关键字
     * @return true if 指定关键字是有效的返回消息关键字, otherwise false
     */
    protected boolean isValidKey(String key) {
        String[] validKeys = getValidKeys();
        if (validKeys == null || validKeys.length == 0)
            return true;
        for (int i = 0; i < validKeys.length; i++) {
            if (validKeys[i].equals(key))
                return true;
        }
        return false;
    }

    public final BankPayResponse copy() {
        AbstractBankPayResponse response = getCopiedInstance();
        response.messages = new HashMap(this.messages);
        return response;
    }

    /**
     * 
     * @return 复制出的AbstractBankPayResponse实例
     */
    protected abstract AbstractBankPayResponse getCopiedInstance();

    public boolean isSuccessful() {
        return getSuccessReturnCode().equals(getReturnCode());
    }

    public Date getDate() {
        // 一般银行不返回订单时间，默认以收到反馈信息的当前时间为订单时间
        return new Date();
    }

    public int getResponseMode() {
        // 默认以页面方式返回
        return Constant.RESPONSE_MODE_PAGE;
    }

    public boolean isAmountValidatable() {
        // 默认不需要验证金额
        return false;
    }

    public String getReturnMessage() {
        return "";
    }

    /**
     * 
     * @return 表示支付成功的返回码
     */
    protected abstract String getSuccessReturnCode();

}